<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>操作符类</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="indexes-partial.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="indexes.html">快退</a></td><td width="60%" align="center" valign="bottom">章11. 索引</td><td width="10%" align="right" valign="top"><a href="indexes.html">快进</a></td><td width="10%" align="right" valign="top"><a href="indexes-examine.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="INDEXES-OPCLASS">11.8. Operator Classes</a></h1><a name="AEN16256"></a>
<p>定义索引的同时可以为索引的每个字段声明一个<i class="FIRSTTERM">操作符类</i>。</p>
<pre class="SYNOPSIS">CREATE INDEX <tt class="REPLACEABLE"><i>name</i></tt> ON <tt class="REPLACEABLE"><i>table</i></tt> (<tt class="REPLACEABLE"><i>column</i></tt> <tt class="REPLACEABLE"><i>opclass</i></tt> [<span class="OPTIONAL">, ...</span>]);</pre>
<p>这个操作符类指明该索引用于该字段时要使用的操作符。例如，一个在 <tt class="TYPE">int4</tt> 上的 B-tree 索引将使用 <tt class="LITERAL">int4_ops</tt> 类；这个操作符类包括用于 <tt class="TYPE">int4</tt> 的比较函数。实际上，字段类型的缺省操作符通常就足够了。拥有操作符类的主要原因是：对于某些数据类型，可能存在多个有意义的索引行为。例如，我们可能想排序两个复数，既可能通过绝对值，也可能通过实部。我们可以通过为该数据类型定义两个操作符类，然后在建立索引时选择合适的那个。</p>
<p>除了缺省的以外，还有一些有内置的操作符类：</p>
<ul>
<li><p><tt class="LITERAL">text_pattern_ops</tt>, <tt class="LITERAL">varchar_pattern_ops</tt>, <tt class="LITERAL">bpchar_pattern_ops</tt>, <tt class="LITERAL">name_pattern_ops</tt> 操作符类分别支持在 <tt class="TYPE">text</tt>, <tt class="TYPE">varchar</tt>, <tt class="TYPE">char</tt>, <tt class="TYPE">name</tt> 类型上的 B-tree 索引。他们与初始的操作符类的区别是数值是严格地逐个字节比较的，而不是根据区域相关的集合规则进行比较。这样，如果服务器不使用标准的"C"区域设置，那么这些操作符类适用于那些涉及模式匹配表达式(<tt class="LITERAL">LIKE</tt> 或者 POSIX 正则表达式)的查询。举一个例子，你可以像下面这样对一个 <tt class="TYPE">varchar</tt> 字段进行索引：</p>
<pre class="PROGRAMLISTING">CREATE INDEX test_index ON test_table (col varchar_pattern_ops);</pre>
<p>请注意，如果你希望包含普通比较的查询使用索引，那么你还应该创建一个使用缺省操作符类的索引。这样的查询不能使用 <tt class="LITERAL"><tt class="REPLACEABLE"><i>xxx</i></tt>_pattern_ops</tt> 操作符类。允许在同一个字段上创建多个使用不同操作符类的索引。如果你确实使用了标准的"C"区域设置，那么你就不需要 <tt class="LITERAL"><tt class="REPLACEABLE"><i>xxx</i></tt>_pattern_ops</tt> 操作符类，因为使用缺省操作符类的索引可以用于 C 区域里面的模式匹配查询。</p></li>
</ul>
<p>下面的查询显示所有已定义的操作符类：</p>
<pre class="PROGRAMLISTING">SELECT am.amname AS index_method,
       opc.opcname AS opclass_name
    FROM pg_am am, pg_opclass opc
    WHERE opc.opcamid = am.oid
    ORDER BY index_method, opclass_name;</pre>
<p>我们可以把它扩展为显示每个表中的所有操作符：</p>
<pre class="PROGRAMLISTING">SELECT am.amname AS index_method,
       opc.opcname AS opclass_name,
       opr.oid::regoperator AS opclass_operator
    FROM pg_am am, pg_opclass opc, pg_amop amop, pg_operator opr
    WHERE opc.opcamid = am.oid AND
          amop.amopclaid = opc.oid AND
          amop.amopopr = opr.oid
    ORDER BY index_method, opclass_name, opclass_operator;</pre>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="indexes-partial.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="indexes-examine.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">部分索引</td><td width="34%" align="center" valign="top"><a href="indexes.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">检查索引的使用</td></tr>
</table>
</div>
</body></html>